package com.suiwei.base;

import org.junit.jupiter.api.Test;
import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @author suiwei
 * @date 2022-10-25 11:40
 */
// decimal：十进制
// 解决小数运算中不精确问题
public class BigDecimalDemo {
  @Test
  void test() {
    double num1 = 0.1;
    double num2 = 0.2;
    System.out.println(num1 + num2); // 0.30000000000000004
    // 创建对象三种方式
    // 方式一：构造函数传double值，不推荐，计算结果依然无法处理小数问题
    BigDecimal big1 = new BigDecimal(0.1);
    BigDecimal big2 = new BigDecimal(0.2);
    System.out.println(big1.add(big2)); // 0.3000000000000000166533453693773481063544750213623046875
    //方式二：构造函数传字符串，推荐
    BigDecimal big3 = new BigDecimal("0.1");
    BigDecimal big4 = new BigDecimal("0.2");
    System.out.println(big3.add(big4)); // 0.3
    //方式三：静态方法valueOf，推荐
    BigDecimal big5 = BigDecimal.valueOf(0.1);
    BigDecimal big6 = BigDecimal.valueOf(0.3);
    System.out.println(big5.add(big6));//0.3
    // 加减乘除
    System.out.println(big5.subtract(big6));//减法
    System.out.println(big5.multiply(big6));//乘法
    System.out.println(big6.divide(big5));//除法，如果除不尽，就会报异常
    System.out.println(big5.divide(big6, 2, RoundingMode.HALF_UP));//（BigDecimal对象，精确位数，舍入模式）四舍五入，保留两位；0.33
    System.out.println(big5.divide(big6, 2, RoundingMode.UP));//进一法，后面内容不要了，向前加一；0.34
    System.out.println(big5.divide(big6, 2, RoundingMode.DOWN));//去尾法，后面的全舍弃；0.33
    //BigDecimal乘法运算不会改变其小数位数，可以使用setScale设置保留的位数
    System.out.println(big5.divide(big6, 2, RoundingMode.HALF_UP).multiply(new BigDecimal("100")));//乘100后，依然是保留2位小数
    System.out.println(big5.divide(big6, 2, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(0,RoundingMode.HALF_UP));//保留0位小数

    //BigDecimal对象转成基本数据类型double
    double result = big5.subtract(big6).doubleValue();

    //比较;大于返回正数，小于返回负数，等于返回0
    BigDecimal temp1 = new BigDecimal(10);
    BigDecimal temp2 = new BigDecimal(20);
    BigDecimal temp3 = new BigDecimal(0);
    System.out.println(temp3.compareTo(BigDecimal.ZERO));//0
    System.out.println(temp1.compareTo(temp2));//-1
  }
}
